#pragma once

namespace Reverse
{
    // 反向迭代器，本质可以用作容器适配器
    template<class Interator,class Ref,class Ptr>
    struct Reverse_Interator
    {
        // 实现原理
        // 在内部封装了一个正向迭代器
        typedef Reverse_Interator<Interator,Ref,Ptr> Self;
        Reverse_Interator(Interator it)
            :_it(it)
        {}
        // 在*时，获取前一个元素，因为rbegin()返回的是哨兵节点或无效节点，rend()返回的是第一个元素
        Ref operator*()
        {
            Interator tmp = _it;
            return *--tmp;
        }
        // 前置
        // 在++和--时，与正向迭代器相反
        Self& operator++()
        {
            --_it;
            return *this;
        }
        Self& operator--()
        {
            ++_it;
            return *this;
        }
        // 后置
        Self operator++(int)
        {
            Self tmp = *this;
            --_it;
            return *this; 
        }
        Self& operator--(int)
        {
            Self tmp = *this;;
            ++_it;
            return *this;;
        }
        // 获取的是前一个元素的地址
        Ptr operator->()
        {
            return &(operator*());
        }
        bool operator!=(const Self& it)const
        {
           return _it != it._it;
        }
        bool operator==(const Self& it)const
        {
           return !(operator!=(it));
        }
        Interator _it;
    };
}
